package com.winning.gjhlht.ihe.job;


import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.log4j.Logger;
import org.quartz.Job;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.winning.common.beans.xmlTemp.XMLTempBeanManager;
import com.winning.common.beans.xmlTemp.XMLTempConfigBean;
import com.winning.common.data.service.PlatBasicDataService;
import com.winning.core.job.BaseJob;
import com.winning.core.job.JobControlInter;
import com.winning.core.job.factory.QuartzJobFactory;
import com.winning.gjhlht.ihe.job.jober.IHERegistrationRequestJober;

/**
 * 类名称：IHEClientJobContoler
 * 类描述：互联互通服务客户端任务控制器
 * 创建人：liuwensheng
 * 创建时间：2016-12-8 下午4:33:44
 * 修改人：liuwensheng
 * 修改时间：2016-12-8 下午4:33:44
 * 修改备注：
 */
@Service(value = "com.winning.lang.ihe.job.IHEClientJobControler")
public class IHEClientJobControler implements JobControlInter {
    private static Logger LOGGER = Logger.getLogger("pbsLoger");

    //存放接口上报任务的缓存, 模板文件的ID为key,xmlTempConfig.xml
    private Map<String, Scheduler> schedulerMap = new HashMap<String, Scheduler>();

    @Autowired
    protected PlatBasicDataService platBasicDataService = null;

    @Override
    public void initJobController() {


        //创建一个SchedulerFactory工厂实例
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();

        Map<String, XMLTempConfigBean> XMLTempConfigBeanMap = XMLTempBeanManager.getInstance().getXMLTempConfigBeanMap();


        //每一个模板节点代表一个接口任务
        for (Entry<String, XMLTempConfigBean> entity : XMLTempConfigBeanMap.entrySet()) {
            //一个模板接口配置任务
            XMLTempConfigBean xmlTempConfigBean = entity.getValue();

            //创建和启动作业
            createAndStartJobHandler(IHERegistrationRequestJober.class, xmlTempConfigBean, schedulerFactory);
        }

        //创建其他需要的作业
        /*
         *  1、先根据xmlTempConfig.xml中设置的模板ID，获取模板配置信息。
         *  2、根据xmlTempConfig.xml中设置的模板的作业信息，创建作业执行器
         *  3、根据xmlTempConfig.xml中设置的作业有效性，判断是否创建作业.
         */


    }

    /**
     * 创建和启动作业 <br/>
     * 方法名称: startJobHandler
     *
     * @param jobClass          作业执行器
     * @param xmlTempConfigBean xml模板配置实体
     * @param schedulerFactory  作业工程类
     * @return void  返回类型说明<br/>
     * @throws <br/>
     * @author liuwensheng@winning.com.cn<br/>
     * 创建时间：2016-12-13/下午3:47:44<br/>
     */
    private void createAndStartJobHandler(Class<? extends Job> jobClass, XMLTempConfigBean xmlTempConfigBean, SchedulerFactory schedulerFactory) {

        //更新增量时间缓存
        platBasicDataService.updateTableIncreaseTimeMapFromDB(xmlTempConfigBean.getDbDataSourseID());

        String serviceID = xmlTempConfigBean.getServiceID();

        //作业的有效性，只有有效的作业模板，才会创建作业
        boolean jobEnable = xmlTempConfigBean.isJobEnable();

        String jobName = QuartzJobFactory.JOB_NAME_FIX + serviceID;

        //需要判断任务有效性和任务是否已存在
        if (jobEnable && !schedulerMap.containsKey(jobName)) {
            String triggerName = QuartzJobFactory.TRIGGER_NAME_FIX + jobName;

            //设置quartz框架任务调度的时间表达式:"秒 分 时 月 年 公式" --> "* * 14-18 * * ?"
            String cronExpression = xmlTempConfigBean.getJobExpressionValue(); //"00 33 11 * * ?";//"* * " + startTimeValue + "-" + endTimeValue + " * * ?";

            //任务框架之间传递参数只能通过Map共享
            HashMap<String, Object> jobDataMap = new HashMap<String, Object>();
            jobDataMap.put(BaseJob.PLAT_BASIC_DATA_SERVICE, platBasicDataService);

            //保存一个模板bean
            jobDataMap.put(BaseJob.XML_TEMP_CONFIG_BEAN, xmlTempConfigBean);

            try {
                //通过SchedulerFactory构建Scheduler对象
                Scheduler scheduler = schedulerFactory.getScheduler();

                scheduler = QuartzJobFactory.createJob(jobName, triggerName, scheduler, jobClass, cronExpression, jobDataMap, null);

                //任务调度器启动
                scheduler.start();

                //缓存已经创建的任务, 每次创建任务时，需要判断任务是否已经存在，如果存在则不创建
                schedulerMap.put(jobName, scheduler);
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
        }
    }

}
